﻿// TCP协议.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>


#include <winsock.h>
#pragma comment(lib,"Ws2_32.lib")




int main()
{
    //0.确定协议版本号 
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("确定协议版本号失败%d\n", GetLastError());
        Sleep(5000);
        return -1;
    }
    printf("确定协议版本号成功\n");


    //1.创建socket
    SOCKET serverSocket = socket(AF_INET /* internetwork: UDP, TCP, etc. */, SOCK_STREAM/*字节流 二进制*/, IPPROTO_TCP/* tcp */);
    if (SOCKET_ERROR == serverSocket)
    {
        printf("创建socket失败%d\n", GetLastError());

        //6.清理协议版本信息
        WSACleanup();

        Sleep(5000);
        return -1;
    }
    printf("创建socket成功\n");


    //2..创建服务器协议地址族
    SOCKADDR_IN sadder = { 0 };
    sadder.sin_family = AF_INET/* internetwork: UDP, TCP, etc. */;      //与第一个参数一致
    sadder.sin_addr.S_un.S_addr = inet_addr("10.133.98.104");      //ip地址      作用是区分主机
    sadder.sin_port = htons(9527);  //大小端模式   一般pc机都是小端      网络服务器是unix系统，是大端       所以把整数从小端转成大端
    //我们电脑一般的端口号是65536个     并且一个应用程序绑定一个端口号    一个程序绑定了 另外一个程序就不能用了      所以使用5000以上的   10000左右的最好     数太大没什么用 数太小有可能别的程序用了   


    //3.链接服务器
    int r = connect(serverSocket, (struct sockaddr*)&sadder, sizeof(sadder));
    if (r == -1)
    {
        printf("链接服务器失败%d\n", GetLastError());

        //5.关闭socket
        closesocket(serverSocket);

        //6.清理协议版本信息
        WSACleanup();

        Sleep(5000);
        return -1;
    }
    printf("链接服务器成功\n");


   


    //4.通信     用户输入     发送给服务器
    char buff[1024];
    while (1)
    {
        memset(buff, 0, 1024);
        printf("请输入:>");
        scanf("%s", buff);
        r = send(serverSocket, buff, strlen(buff), NULL);   //发送
        printf("发送%d数据到服务器\n", r);
    }


    //5.关闭socket
    closesocket(serverSocket);


    //6.清理协议版本信息
    WSACleanup();


    //注意单有Client    不要直接运行

    return 0;
}


